// src/main/modules/ipcHandlers/fileSystemIpc.js
// 文件系统相关的 IPC 处理程序

// 使用 ES6 import 语法导入 Electron 和 Node.js 模块
import { ipcMain, dialog } from 'electron'
import fs from 'fs/promises'
import path from 'path'

/**
 * 注册所有文件系统相关的 IPC 处理程序
 * 此函数应在主进程初始化时调用
 */
export function registerFileSystemIpcHandlers() {
  /**
   * IPC 处理程序: 打开目录选择对话框
   * 渲染进程调用: await ipcRenderer.invoke('dialog:openDirectory')
   * @returns {Promise<Electron.OpenDialogReturnValue>} 对话框返回结果
   */
  ipcMain.handle('dialog:openDirectory', async () => {
    const result = await dialog.showOpenDialog({ properties: ['openDirectory'] })
    return result
  })

  /**
   * IPC 处理程序: 读取目录内容
   * 渲染进程调用: await ipcRenderer.invoke('fs:readdir', '/some/path')
   * @param {any} event - IPC 事件对象
   * @param {string} dirPath - 要读取的目录路径
   * @returns {Promise<string[]>} 目录下的文件和文件夹名称数组
   * @throws {Error} 如果路径无效或读取失败
   */
  ipcMain.handle('fs:readdir', async (event, dirPath) => {
    try {
      if (!dirPath || typeof dirPath !== 'string') {
        throw new Error('Invalid directory path provided to fs:readdir')
      }
      return await fs.readdir(dirPath)
    } catch (error) {
      console.error(`Error reading directory ${dirPath}:`, error)
      // 将错误重新抛出，以便渲染进程可以捕获
      throw error
    }
  })

  /**
   * IPC 处理程序: 获取文件/目录状态信息
   * 渲染进程调用: await ipcRenderer.invoke('fs:stat', '/some/file.txt')
   * @param {any} event - IPC 事件对象
   * @param {string} filePath - 要获取状态的文件或目录路径
   * @returns {Promise<fs.Stats>} 文件状态对象
   * @throws {Error} 如果路径无效或获取状态失败
   */
  ipcMain.handle('fs:stat', async (event, filePath) => {
    try {
      if (!filePath || typeof filePath !== 'string') {
        throw new Error('Invalid file path provided to fs:stat')
      }
      return await fs.stat(filePath)
    } catch (error) {
      console.error(`Error stating file ${filePath}:`, error)
      // 将错误重新抛出
      throw error
    }
  })

  /**
   * IPC 处理程序: 路径拼接
   * 渲染进程调用: await ipcRenderer.invoke('path:join', 'dir', 'subdir', 'file.txt')
   * @param {any} event - IPC 事件对象
   * @param {...string} paths - 要拼接的路径片段
   * @returns {string} 拼接后的路径
   */
  ipcMain.handle('path:join', async (event, ...paths) => {
    // path.join 本身是同步的，这里用 async/await 包裹主要是为了保持 IPC handler 的一致性
    // 如果 paths 包含非字符串，path.join 会处理或抛出错误
    return path.join(...paths)
  })

  /**
   * IPC 处理程序: 计算相对路径
   * 渲染进程调用: await ipcRenderer.invoke('path:relative', '/from/path', '/from/path/to/target')
   * @param {any} event - IPC 事件对象
   * @param {string} from - 起始路径
   * @param {string} to - 目标路径
   * @returns {string} 从 from 到 to 的相对路径
   * @throws {Error} 如果路径无效
   */
  ipcMain.handle('path:relative', async (event, from, to) => {
    try {
      if (!from || !to || typeof from !== 'string' || typeof to !== 'string') {
        throw new Error('Invalid paths provided to path:relative')
      }
      return path.relative(from, to)
    } catch (error) {
      console.error(`Error calculating relative path from ${from} to ${to}:`, error)
      // 将错误重新抛出
      throw error
    }
  })

  // --- 可以在这里添加更多文件系统相关的 IPC 处理程序 ---
  // 例如:
  /*
  ipcMain.handle('fs:readFile', async (event, filePath, options) => {
    try {
      if (!filePath || typeof filePath !== 'string') {
        throw new Error('Invalid file path provided to fs:readFile');
      }
      return await fs.readFile(filePath, options);
    } catch (error) {
      console.error(`Error reading file ${filePath}:`, error);
      throw error;
    }
  });

  ipcMain.handle('fs:writeFile', async (event, filePath, data, options) => {
    try {
      if (!filePath || typeof filePath !== 'string') {
        throw new Error('Invalid file path provided to fs:writeFile');
      }
      await fs.writeFile(filePath, data, options);
      return { success: true };
    } catch (error) {
      console.error(`Error writing file ${filePath}:`, error);
      throw error;
    }
  });
  */
}

// 如果需要，也可以导出单个处理函数，但通常在模块化结构中，我们导出一个注册所有处理程序的函数
// export { registerFileSystemIpcHandlers };



